home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / asm / Asm_Course2.lha / Teil08.TXT < prev    next >
Text File  |  1993-09-01  |  13KB  |  372 lines

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                  8.Teil...
  4.  
  5. So, wenn ihr dieses Modul einbaut, muessen natuerlich einige Aenderung an
  6. dem hauptprogramm gemacht werden, alles moegliche was die Copperliste
  7. betrifft, ich werde das listing liefern. Allerdings werden wir vorher noch
  8. in gedanken mit der Routine arbeiten.
  9. Sie erstellt ja eine Copperliste, die halt aber nur Farbenspielerei macht.
  10.  
  11. Wenn wir dazu jetzt noch ein Bild darstellen wollen muessen wir irgendwo
  12. die sachen fuer das Bild einfuegen.
  13. Da waere die Kopierroutine fuer die farben, und die ganzen sachen inder
  14. Copperliste.
  15. Da die Copperliste nicht mehr wie vorher schon fertig im Source liegt,
  16. sondern wir sie erstmal erzeugen muessen die Einstellungen fuer den Bild
  17. Modus auch so dort eingebaut werden.
  18. Wir muessen das Allerdings vor der erstellungs routine, direkt nachdem die
  19. Adresse fuer die Neue Copperliste festgelegt ist. Da die Werte ja jedem
  20. bekant sind brauche ich wohl keine Erklaerung abzugeben, oder ?
  21. Ich erklaere das am Beispiel einer Plane, weil mir Fuenf zuviel zu
  22. schreiben ist.
  23. Es saehe ungefaehr so aus...
  24.  
  25. ...
  26. ...
  27. ...
  28.         Lea $50000,a0
  29.         Move.l #$00e00006,(a0)+
  30.         Move.l #$00e20000,(a0)+
  31.         Move.l #$01001200,(a0)+
  32.  
  33. Erst jetzt kommt die Erstellungsroutine...
  34.  
  35. Nu, kommt das listing...und dann werde ich mal gucken ob ich wieder mal was
  36. neues einbauen kann...sonst wirds langweilig, gell ?
  37.  
  38. start:
  39. execbase=       4
  40. openlibrary=    -408
  41. vhposr=         $dff006
  42. forbid=         -30-102
  43. permit=         -30-108
  44. dmacon=         $dff096
  45. intena=         $dff09a
  46. cop1lc=         $dff080
  47.  
  48.         move.w  #$0020,dmacon
  49.         move.w  #$4000,intena
  50.         move.l  execbase,a6
  51.         jsr     forbid(a6)
  52.  
  53.         lea     $5ffc0,a0
  54.         lea     $dff180,a1
  55.         move.w  #31,d0
  56. colorcopy:
  57.         move.w (a0)+,(a1)+
  58.         dbf d0,colorcopy
  59.  
  60.         Bsr.s   makecopperliste
  61.  
  62. wait:
  63.         btst    #6,$bfe001
  64.         bne     wait
  65.  
  66.         move.l  execbase,a6
  67.         jsr     permit(a6)
  68.         lea     gfxname(pc),a1
  69.         jsr     openlibrary(a6)
  70.         move.l  d0,a6
  71.         move.w  #$83e0,dmacon
  72.         move.w  #$c000,intena
  73.         move.l  38(a6),$dff080
  74.         moveq   #0,d0
  75.         rts
  76.  
  77. gfxname:        dc.b "graphics.library",0
  78. even
  79.  
  80. makecopperliste:
  81.         Lea $50000,a0
  82.                                 ; Jetzt muessen die definitionen
  83.                                 ; Fuer die Bildersachen eingesetzt
  84.                                 ; werden
  85.         Move.l #$00e00006,(a0)+
  86.         Move.l #$00e20000,(a0)+
  87.         Move.l #$00e40006,(a0)+
  88.         Move.l #$00e62800,(a0)+
  89.         Move.l #$00e80006,(a0)+
  90.         Move.l #$00ea5000,(a0)+
  91.         Move.l #$00ec0006,(a0)+
  92.         Move.l #$00ee7800,(a0)+
  93.         Move.l #$00f00006,(a0)+
  94.         Move.l #$00f2a000,(a0)+
  95.         Move.l #$01005200,(a0)+
  96.         Move.l #$008e3081,(a0)+
  97.         Move.l #$009030c1,(a0)+
  98.         Move.l #$00920038,(a0)+
  99.         Move.l #$009400d0,(a0)+
  100.                                 ; weiter mit der erstellungsroutine
  101.  
  102.         Move.w #$-2,d0
  103.         Move.w #$0180,d1                ; Hier koennt ihr mal andere
  104.                                         ; werte eingeben. z.b $0182
  105.                                         ; Oder $0184...
  106.                                         ; Dann seht ihr wie sich teile
  107.                                         ; grafik verfaerben.
  108.         Move.w #$200f,d2
  109.         Move.w #$0000,d3
  110.         Move.w #$00e0,d4
  111. Copperloop:
  112.         Move.w d2,(a0)+
  113.         Move.w d0,(a0)+
  114.         Move.w d1,(a0)+
  115.         Move.w d3,(a0)+
  116.         Add.w #$0100,d2
  117.         Add.w #$0101,d3                 ; Mit den Add wert koennt ihr
  118.                                         ; ein bisschen spielen
  119.                                         ; da kommen manchmal schoene
  120.                                         ; effekte bei rum.
  121.         Dbf d4,copperloop
  122.         Move.l #$01800000,(a0)+
  123.         Move.l #$-2,(a0)+
  124.         Move.l #$50000,cop1lc
  125.         rts
  126.  
  127. >extern "pic32.raw",$5ffc0
  128.  
  129. So, ich habe beigeschrieben was man veraendern kann. Den Effekt mit den
  130. Anderen Registern sieht man am besten, wenn ihr euch ein Bild mit 32
  131. Vierecken malt, alle in verschiedenen Farben.
  132.  
  133. Nun, jetzt wollen wir uns mal etwas zuwenden, das jeder Introschreiber oder
  134. Demomensch aus dem FF und in allen moeglichen Variationen Beherschen !MUSS!
  135.  
  136. 11.Horizontales und Vertikales Softscrolling.
  137.  
  138. Was damit gemeint ist...Ganz Klar, am ende dieses grossen Kapitals steht
  139. eine Laufschrift (Horizontal) und ein Schwingendes Logo (vertikal)
  140. Mit der Vertikalen Laufschrift will ich noch was warten, da dies mit dem
  141. Blitter am allereinfachsten geht, und ohne eine Scheissarbeitet ist.
  142.  
  143. Fangen wir erstmal mit dem Horizontalen Scrolling an...
  144.  
  145. Wie koennte man das realisieren ?
  146.  
  147. Hmmm, eigentlich keine Sache, wir setzen die Bitplane Pointers der planes
  148. einfach eine Zeile rauf oder runter. Das bild verhaelt sich allerdings
  149. umgekehrt. Setzen wir also den Pointer eine Zeile Tiefer, rutscht das Bild
  150. eins Hoeher, da ja mit der darstellung, etwas tiefer im Bild begonnen
  151. wird, geht das Bild Hoeher.
  152.  
  153. Falls ihr das nicht versteht, mal ein kleine Erklaerung wie der Amiga das
  154. mit den Planes und den Pointern macht.
  155.  
  156. ...Wenn der Amiga am Anfang der Ersten Zeile ist nimmt er sich den Pointer
  157. fuer die Plane (ich rede wieder von einem Bild mit einer Plane), und
  158. stellt die Zeile dar. Wenn die Zeile dargstellt ist, schaut er wielang die
  159. Zeile jetzt war, und setzt den Pointer genau auf den Anfang der Naechsten
  160. Zeile. Wenn er jetzt mit der Naechsten zeile beginnt, kriegt er Automatisch
  161. den Pointer fuer die naechste Zeile im Bild und das ganze geht weiter.
  162.  
  163. Wie lange jetzt die Zeile ist haengt von den Diw und Ddf werten ab, in
  164. unserem Fall sind es 40 bytes. Wir koennen uns allerdings bei diesen doch
  165. sehr internen vorgang einmischen..und das durch die Modulo register.
  166. Sie sagen dem Amiga, wieviel er die Pointer zusaetzlich zu der Zeilenlaenge
  167. weiter stellen soll. Im normal fall sind diese 0 so das nur die
  168. Zeilenlaenge gesetzt wird. Nehmen wir dort 40, wird immer eine Zeile
  169. Uebersrungen. Nehmen wir -40 wird immer diesselbe Zeile gezeigt. Nehmen wir
  170. -80 koennen wir, wenn wir den Bitplane pointer am anfang der Copperlisten
  171. auf das ende der plane stellen, das Bild sogar auf dem Kopf darstellen.
  172.  
  173. Wofuer man diese Modulo register braucht werdet ihr sicherlich wissen
  174. wollen, den Spiegeln ist auf diese Art und weise sicherlich keine
  175. Ernsthafte anwendung.
  176. Nun, man kann damit Spielfelder benutzen die Groesser als das Playfield
  177. sind, ja die sogar groesser als der Bildschirm sind.
  178. Mal im Klar text....Das Ram, der Speicher besteht ja aus lauter stellen,
  179. wir fassen sie zu Bytes zusammen, das erleichtert das verstaendnis. Man
  180. stellt sich im Allgemeinen den Speicher so vor
  181.  
  182. $40000
  183. $40001
  184. $40002
  185. $40003
  186.  
  187. oder so...
  188. Das heisst man denkt er besteht aus einem Byte nachdem anderen. Das ist
  189. richtig so..allerdings koennen wir ihn auch rechteckig
  190. darstellen...Monitore Machen das, da sieht es so aus
  191.  
  192. $40000 $40001 $40002 $40003
  193. $40004 $40005 $40006 $40007
  194.  
  195. Im endeffekt ist das dasselbe, allerdings denken wir es uns anders.
  196. Bei den Bitplane wird auch ein solch rechteckige Speicher bereich
  197. unterstuetzt. Da liegen dann aber immer (wie in unserem beispiel) 40 bytes
  198. nebeneinander, und dann kommt erst die Neue Zeile. Eine neue Zeile ist es
  199. ja nicht den die Sachen liegen ja hintereinander, aber man stellt sich das
  200. halt so vor.
  201. Kommen wir nun zum Einsatz der Modulo register.
  202. Stellen wir uns mal vor wir haetten ein Malprogramm mit dem man bilder von
  203. 800*800 malen koennte. Das bild waere im Speicher dann 100*800 Bytes, das
  204. heisst 80000 Bytes lang. Wenn wir jetzt einen Ausschnitt auf den Bildschirm
  205. bringen wollten, muessten wir ja Theoretisch nur die Bitplanepointer
  206. setzen.
  207. Aber schauen wir mal was er dann macht. Stellen wir uns vor wir haben das
  208. Bild bei $40000 mit dem >Extern kommando deponiert.
  209. Er zeigt die ertse Zeile, gut jetzt kommt er ans Ende...Aha 40 bytes,
  210. er stellt den Pointer eine zeile vor...denkt er...Denn die zeilen vom
  211. Ausschnitt stimmen ja nicht mit den wahren zeilenlaengen ueberein. Der
  212. richtige Zeilen anfang liegt ja noch 60 Bytes weiter...Also genau dafuer
  213. sind die Modulo werte...Da kann man jetzt genau diese 60 eintragen, und
  214. schon stimmt die Sache...
  215.  
  216. Wir werden diese Uebergroáen bildschirme Allerdings erst benutzen wenn wir
  217. den Blitter beherrschen, da wir uns mangels eines Malprogramms was diese
  218. Grossen Bilder packt, die sachen selber zusammenschustern muessen.
  219. Aber fuer ein paar nette effekte werden die Moduloregister schon hinhalten.
  220. Ich denke dabei an einen Wasser effekt oder so aehnlich....
  221.  
  222. Na wird der Mund langsam waessrig.....
  223.  
  224. Aber wir wollen erstmal langsam anfangen indem wir ein Logo von unten nach
  225. oben ueber den Bildschirm fahren lassen, O.K ?
  226.  
  227. Wie schon gesagt ist das sehr einfach, wir muessen einfach nur die Bitplane
  228. pointer einens Bildes in geregelten Zeitlichen abstaenden hochzaehlen.
  229. Das geht sehr einfach mit Add...is ja klar, ne ?
  230. Muessen wir das einfarbige Logo malen...ihr koennt natuerlich auch das
  231. erste Bild benutzen was ihr gemalt habt..
  232.  
  233. Dann machen wir vor und hinter der Plane noch eine Plane platz. Damit wir
  234. das Bild wirklich von ganz unten in den Bildschirm reinkommen lassen
  235. koennen, um es ganz oben wieder rauszuschieben.
  236.  
  237. Die sachen fuer die Abfragen ob schon ganz unten und so erklaere ich
  238. nachher.
  239.  
  240.  
  241. start:
  242. execbase=       4
  243. openlibrary=    -408
  244. vhposr=         $dff006
  245. forbid=         -30-102
  246. permit=         -30-108
  247. dmacon=         $dff096
  248. intena=         $dff09a
  249. cop1lc =        $dff080
  250.  
  251.  
  252.         move.w  #$0020,dmacon
  253.         move.w  #$4000,intena
  254.         move.l  execbase,a6
  255.         jsr     forbid(a6)
  256.  
  257.         Lea $5fffc,a0
  258.         Lea $dff180,a1
  259.         Move.w #1,d0
  260. Colorloop:
  261.         Move.w (a0)+,(a1)+
  262.         dbf d0,colorloop
  263.         move.l  #copperliste,cop1lc
  264.  
  265.                                         ; jetzt werden gleichzeitig
  266.                                         ; zwei planes geloescht und
  267.                                         ; unser Bild mittenreinkopiert
  268.  
  269.         Lea $50000,a0                   ; loeschzeiger 1.Plane
  270.         Lea $60000,a1                   ; Quelle 2.plane
  271.         Lea $52800,a2                   ; Ziel 2.plane
  272.         Lea $55000,a3                   ; Loeschzeiger 3.plane
  273.         Move.w #$27ff,d0                ; Counter
  274. ClearCopyloop:
  275.         Clr.b (a0)+
  276.         move.b (a1)+,(a2)+
  277.         Clr.b (a3)+
  278.         dbf d0,Clearcopyloop
  279.  
  280. wait:
  281.         cmpi.b #$80,vhposr
  282.         bne.s wait
  283.  
  284.         Move.l #copperliste,a0
  285.         Add.w #$28,6(a0)
  286.  
  287.         cmp.w #$5000,6(a0)
  288.         beq.s raus
  289.  
  290.         btst    #6,$bfe001
  291.         bne.s   wait
  292. raus:
  293.         move.l  execbase,a6
  294.         jsr     permit(a6)
  295.         lea     gfxname(pc),a1
  296.         jsr     openlibrary(a6)
  297.         move.l  d0,a6
  298.         move.w  #$83e0,dmacon
  299.         move.w  #$c000,intena
  300.         move.l  38(a6),$dff080
  301.         moveq   #0,d0
  302.         rts
  303.  
  304. gfxname:        dc.b "graphics.library",0
  305.  
  306. >Extern         "bild1.raw",$5fffc
  307. even
  308.  
  309. copperliste:
  310. dc.w $00e0,$0005        ;Hi und Lo pointer der olaneadresse im ram
  311. dc.w $00e2,$0000
  312. dc.w $0100,$1200        ;Bplcon0 1 Plane, Lores
  313. dc.w $008e,$3081        ;Diwstrt
  314. dc.w $0090,$30c1        ;Diwstop
  315. dc.w $0092,$0038        ;Ddfstrt
  316. dc.w $0094,$00d0        ;Ddfstop
  317.  
  318.  
  319. coperlistenende:
  320. dc.l $-2
  321.  
  322.  
  323. So das waers..das programm kopiert die geladene Bitplane nach $52800,
  324. loescht davor und dahinter jeweils eine Plane, und setzt den Pointer auf
  325. die erste Leere plane...
  326.  
  327. Dann kommt die Modifikation an der laufenden Copperliste (fuer euch ja kein
  328. Problem mehr, oder.
  329.  
  330. Die Verzoegerungsschleife wartet erstmal bis zeile #$80, dann geht es
  331. weiter. Danach stellt sie den Pointer um eine zeile weiter. Dann
  332. ueberprueft sie ob $5000, aslo die Letzte Plane schon komplett auf dem
  333. Bildschirm ist. Dazu benutze ich einen Befehl `Beq` . Er stellt das genaue
  334. gegenstueck zum Bne befehl dar. Er verzweigt dann wenn das ergebnis null
  335. war. Er springt dann sofort raus. Dann wird noch mal die Maus abgefragt,
  336. ihr koennt also auch schon waehrend das Programm noch laeuft wieder zurueck
  337. zum Seka gelangen.
  338.  
  339. Achja, ich sollte nochmal schnell erklaeren wie Bne, Beq und der Cmp-befehl
  340. zusammen passen.
  341. Prozessoren Vergleichen alles durch abziehen. Das heisst wenn ich die
  342. Speicher stelle $40000 mit #$5000 vergleichen soll, zieht der prozessor vom
  343. Wert in $40000 die #$5000 ab. Das ergebnis merkt er sich nicht, sondern er
  344. setzt nur die Flags, War es die Zahl ist das Z-Flag 0 war sie es nicht ist
  345. es 1.
  346. Da setze ich mit den befehle an. Es gibt zwei arten von Compareschleife
  347.  
  348. Wahrschleife und Nichtwahrschleife
  349.  
  350. Nichtwahrschleife..es ist die erste in unserem Programm...Sie heiát
  351.  
  352. "Wenn Zeile #$80 noch nicht erreicht, dann weiter mit..."
  353.  
  354. Wahrschleife
  355.  
  356. "Wenn schon bei $5000 dann raus zum..."
  357.  
  358. Alles Klor...
  359.  
  360. Es gibt noch eine Ganze menge von diesen Abfragen wie z.b
  361.  
  362. Groesser oder Gleich
  363. Kleiner oder Gleich
  364. Ergebnis im Negative Bereich
  365. Ergebnis im Positiven Bereich
  366.  
  367. aber das ist ein Bisschen Viel fuer heute...Beim naechsten mal mehr
  368.  
  369. maht ett Jot
  370.  
  371.                 Jeff Kandle
  372.